package TecMaster.Ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import TecMaster.Cliente;
import TecMaster.GDA;
import TecMaster.Equipamentos.AparelhoDeSom;
import TecMaster.Equipamentos.Computador;
import TecMaster.Equipamentos.Dvd;
import TecMaster.Equipamentos.Equipamento;
import TecMaster.Equipamentos.Tv;
import TecMaster.Equipamentos.VideoGame;

/**
 * Classe responsavel pela tela de cadastrar equipamento.
 * 
 * @author Flavio Ramalho
 * 
 */

public class CadastrarEquipamento extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	private JPanel panel, panelTipo, panelDefeito, panelGarantia, panelMarca,
			panelNotaFiscal, panelEquipamento;
	private JCheckBox cbTipoTv, cbTipoComputador, cbTipoAparelhoDeSom,
			cbTipoDvd, cbTipoVideoGame, cbDefeitoNaoLiga,
			cbDefeitoDesligaAposLigar, cbDefeitoSemSinalAudio,
			cbDefeitoSemSinalVideo, cbGarantiaSim, cbGarantiaNao, cbMarcaSony,
			cbMarcaLg, cbMarcaPhilips, cbMarcaSamsung;
	private ButtonGroup bgTipo, bgDefeito, bgGarantia, bgMarca;
	private JTextField tfNotaFiscal, tfCliente;
	private JButton botaoCancelar, botaoConcluir;
	private Opcoes opcoes;
	private Cliente cliente;
	private String cpf;
	private int codigoDoEquipamento;
	public String Codigo = "Codigo.dat";
	private GDA<Equipamento> gda = new GDA<Equipamento>();

	/**
	 * Constructor de cadastra Equipamento
	 * 
	 * @param telaDeOpcoes
	 *            a tela de opcoes
	 * @param cliente
	 *            o cliente
	 * @param cpf
	 *            o cpf do cliente
	 * @throws Exception
	 */
	public CadastrarEquipamento(Opcoes telaDeOpcoes, Cliente cliente, String cpf)
			throws Exception {
		super("TecMaster - Cadastrar Equipamento");
		setIconImage(Toolkit.getDefaultToolkit().getImage(
				getClass().getResource("/imagens/TM.png")));
		if (cliente != null)
			this.cliente = cliente;
		if (cliente == null)
			this.cliente = telaDeOpcoes.localizaClientePeloCpf(cpf);
		this.opcoes = telaDeOpcoes;
		this.cpf = cpf;
		if (gda.verificaArquivos(Codigo)) {
			codigoDoEquipamento = gda.leArquivosCodigo();
		} else {
			codigoDoEquipamento = 0;
		}
		codigoDoEquipamento++;
		gda.guardaArquivos(codigoDoEquipamento, Codigo);
		;

		panel = new JPanel(null);
		panel.setBackground(Color.LIGHT_GRAY);
		setBounds(new java.awt.Rectangle(0, 0, 300, 300));
		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(panel, BorderLayout.CENTER);

		// EQUIPAMENTO
		panelEquipamento = new JPanel(null);
		panelEquipamento.setBackground(Color.LIGHT_GRAY);
		panelEquipamento.setBorder(new TitledBorder("Equipamento"));
		panelEquipamento.setBounds(5, 50, 385, 340);

		// TIPO
		panelTipo = new JPanel();
		panelTipo.setBackground(Color.LIGHT_GRAY);
		panelTipo.setLayout(new FlowLayout());
		panelTipo.setBorder(new TitledBorder("Tipo"));
		panelTipo.setBounds(15, 20, 355, 85);

		cbTipoTv = new JCheckBox("TV");
		cbTipoComputador = new JCheckBox("Computador");
		cbTipoDvd = new JCheckBox("DVD");
		cbTipoVideoGame = new JCheckBox("Video Game");
		cbTipoAparelhoDeSom = new JCheckBox("Aparelho de Som");

		bgTipo = new ButtonGroup();
		bgTipo.add(cbTipoTv);
		bgTipo.add(cbTipoComputador);
		bgTipo.add(cbTipoDvd);
		bgTipo.add(cbTipoAparelhoDeSom);
		bgTipo.add(cbTipoVideoGame);

		panelTipo.add(cbTipoTv);
		panelTipo.add(cbTipoComputador);
		panelTipo.add(cbTipoDvd);
		panelTipo.add(cbTipoAparelhoDeSom);
		panelTipo.add(cbTipoVideoGame);

		panelEquipamento.add(panelTipo);

		// MARCA
		panelMarca = new JPanel();
		panelMarca.setBackground(Color.LIGHT_GRAY);
		panelMarca.setLayout(new FlowLayout());
		panelMarca.setBorder(new TitledBorder("Marca"));
		panelMarca.setBounds(15, 105, 355, 60);

		cbMarcaLg = new JCheckBox("LG");
		cbMarcaSamsung = new JCheckBox("Samsung");
		cbMarcaPhilips = new JCheckBox("Philips");
		cbMarcaSony = new JCheckBox("Sony");

		bgMarca = new ButtonGroup();
		bgMarca.add(cbMarcaLg);
		bgMarca.add(cbMarcaSony);
		bgMarca.add(cbMarcaPhilips);
		bgMarca.add(cbMarcaSamsung);

		panelMarca.add(cbMarcaLg);
		panelMarca.add(cbMarcaSony);
		panelMarca.add(cbMarcaPhilips);
		panelMarca.add(cbMarcaSamsung);

		panelEquipamento.add(panelMarca);

		// DEFEITO
		panelDefeito = new JPanel();
		panelDefeito.setBackground(Color.LIGHT_GRAY);
		panelDefeito.setLayout(new FlowLayout());
		panelDefeito.setBorder(new TitledBorder("Defeito"));
		panelDefeito.setBounds(15, 165, 355, 100);

		cbDefeitoNaoLiga = new JCheckBox("Nao liga");
		cbDefeitoDesligaAposLigar = new JCheckBox("Desliga apos ligar");
		cbDefeitoSemSinalAudio = new JCheckBox("Sem sinal de audio");
		cbDefeitoSemSinalVideo = new JCheckBox("Sem sinal de video");

		bgDefeito = new ButtonGroup();
		bgDefeito.add(cbDefeitoNaoLiga);
		bgDefeito.add(cbDefeitoDesligaAposLigar);
		bgDefeito.add(cbDefeitoSemSinalAudio);
		bgDefeito.add(cbDefeitoSemSinalVideo);

		panelDefeito.add(cbDefeitoNaoLiga);
		panelDefeito.add(cbDefeitoDesligaAposLigar);
		panelDefeito.add(cbDefeitoSemSinalAudio);
		panelDefeito.add(cbDefeitoSemSinalVideo);

		panelEquipamento.add(panelDefeito);

		// GARANTIA
		panelGarantia = new JPanel();
		panelGarantia.setBackground(Color.LIGHT_GRAY);
		panelGarantia.setLayout(new FlowLayout());
		panelGarantia.setBorder(new TitledBorder("Garantia"));
		panelGarantia.setBounds(15, 265, 160, 60);

		cbGarantiaSim = new JCheckBox("Sim");
		cbGarantiaNao = new JCheckBox("Nao");

		bgGarantia = new ButtonGroup();
		bgGarantia.add(cbGarantiaSim);
		bgGarantia.add(cbGarantiaNao);

		panelGarantia.add(cbGarantiaSim);
		panelGarantia.add(cbGarantiaNao);

		panelEquipamento.add(panelGarantia);

		// NOTA FISCAL
		panelNotaFiscal = new JPanel(null);
		panelNotaFiscal.setBackground(Color.LIGHT_GRAY);
		panelNotaFiscal.setBorder(new TitledBorder("Numero da Nota Fiscal"));
		panelNotaFiscal.setBounds(180, 265, 190, 60);

		tfNotaFiscal = new JTextField();
		tfNotaFiscal.setBounds(10, 23, 170, 25);

		panelNotaFiscal.add(tfNotaFiscal);

		panelEquipamento.add(panelNotaFiscal);

		panel.add(panelEquipamento);

		// CLIENTE
		tfCliente = new JTextField();
		tfCliente.setEditable(false);
		tfCliente.setText("Cliente: " + getCliente().getNome());
		tfCliente.setBounds(30, 15, 330, 25);

		panel.add(tfCliente);

		// BOTAO CANCELAR E CONCLUIR
		botaoCancelar = new JButton("Cancelar");
		botaoCancelar.setIcon(new ImageIcon(getClass().getResource(
				"/imagens/cancel.png")));
		botaoCancelar.setBounds(50, 405, 100, 40);
		botaoCancelar.addActionListener(this);
		panel.add(botaoCancelar);

		botaoConcluir = new JButton("Concluir");
		botaoConcluir.setIcon(new ImageIcon(getClass().getResource(
				"/imagens/accept.png")));
		botaoConcluir.setBounds(235, 405, 100, 40);
		botaoConcluir.addActionListener(this);
		panel.add(botaoConcluir);

		pack();
		setSize(400, 500);
		setResizable(false);
		setVisible(true);
		setLocationRelativeTo(null);
		addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent evt) {
				getOpcoes().setVisible(true);
				dispose();
			}
		});
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == botaoCancelar) {
			getOpcoes().setVisible(true);
			dispose();
		}
		if (e.getSource() == botaoConcluir)
			try {
				Equipamento equipamento = criaEquipamento();
				getOpcoes().setVisible(true);
				getOpcoes().adicionaNaAgenda(equipamento);
				if (cpf == null)
					getOpcoes().cadastraNaEmpresa(getCliente(), equipamento);
				if (cpf != null)
					getOpcoes().cadastraEquipamentoNaEmpresa(getCpf(),
							equipamento);
				dispose();
				new RelatorioDoCliente(getOpcoes(), equipamento, cliente);
			} catch (Exception eEquip) {
				JOptionPane.showMessageDialog(null, eEquip.getMessage(),
						"ERRO!", JOptionPane.ERROR_MESSAGE);
			}
	}

	/**
	 * Cria um equipamento do cliente
	 * 
	 * @return o equipamento criado
	 * @throws Exception
	 *             Algum tipo de equipamento nao for marcada
	 */
	public Equipamento criaEquipamento() throws Exception {
		if (cbTipoTv.isSelected())
			return new Tv(pegaMarca(), pegaDefeito(), pegaNumeroNotaFiscal(),
					getCodigoDoEquipamento(), pegaGarantia(), getOpcoes()
							.pegaDiasNaAgenda());
		if (cbTipoAparelhoDeSom.isSelected())
			return new AparelhoDeSom(pegaMarca(), pegaDefeito(),
					pegaNumeroNotaFiscal(), getCodigoDoEquipamento(),
					pegaGarantia(), getOpcoes().pegaDiasNaAgenda());
		if (cbTipoComputador.isSelected())
			return new Computador(pegaMarca(), pegaDefeito(),
					pegaNumeroNotaFiscal(), getCodigoDoEquipamento(),
					pegaGarantia(), getOpcoes().pegaDiasNaAgenda());
		if (cbTipoDvd.isSelected())
			return new Dvd(pegaMarca(), pegaDefeito(), pegaNumeroNotaFiscal(),
					getCodigoDoEquipamento(), pegaGarantia(), getOpcoes()
							.pegaDiasNaAgenda());
		if (cbTipoVideoGame.isSelected())
			return new VideoGame(pegaMarca(), pegaDefeito(),
					pegaNumeroNotaFiscal(), getCodigoDoEquipamento(),
					pegaGarantia(), getOpcoes().pegaDiasNaAgenda());
		else
			throw new Exception("Marque o tipo do equipamento");
	}

	/**
	 * pega o defeito marcado pelo usu�rio
	 * 
	 * @return o defeito marcado
	 * @throws Exception
	 *             caso defeito n�o tiver sido marcado
	 */
	public Equipamento.DefeitosMaisComuns pegaDefeito() throws Exception {
		if (cbDefeitoDesligaAposLigar.isSelected())
			return Equipamento.DefeitosMaisComuns.DESLIGA_APOS_LIGAR;
		if (cbDefeitoNaoLiga.isSelected())
			return Equipamento.DefeitosMaisComuns.NAO_LIGA;
		if (cbDefeitoSemSinalAudio.isSelected())
			return Equipamento.DefeitosMaisComuns.SEM_SINAL_AUDIO;
		if (cbDefeitoSemSinalVideo.isSelected())
			return Equipamento.DefeitosMaisComuns.SEM_SINAL_VIDEO;
		else
			throw new Exception("Marque algum defeito");
	}

	/**
	 * Pega a marca do equipamento selecionado pelo usu�rio
	 * 
	 * @return a marca do equipamento selecionado
	 * 
	 * @throws Exception
	 *             alguma marca n�o tiver sido selecionada
	 */
	public Equipamento.MarcasAutorizadas pegaMarca() throws Exception {
		if (cbMarcaLg.isSelected())
			return Equipamento.MarcasAutorizadas.LG;
		if (cbMarcaPhilips.isSelected())
			return Equipamento.MarcasAutorizadas.PHILIPS;
		if (cbMarcaSamsung.isSelected())
			return Equipamento.MarcasAutorizadas.SAMSUNG;
		if (cbMarcaSony.isSelected())
			return Equipamento.MarcasAutorizadas.SONY;
		else
			throw new Exception("Marque alguma marca");
	}

	/**
	 * Pega a garantia selecionada pelo usu�rio
	 * 
	 * @return a garantia selecionada pelo usu�rio
	 * @throws Exception
	 *             garantia n�o tiver sido selecionada
	 */
	public boolean pegaGarantia() throws Exception {
		if (cbGarantiaSim.isSelected())
			return true;
		if (cbGarantiaNao.isSelected())
			return false;
		else
			throw new Exception("Marque a garantia");
	}

	/**
	 * pega o numero da nota fiscal digitada pelo usu�rio
	 * 
	 * @return o numero da nota fiscal digitada pelo usu�rio
	 */
	public String pegaNumeroNotaFiscal() {
		return tfNotaFiscal.getText();
	}

	/**
	 * Retorna a tela de op�oes
	 * 
	 * @return a tela de op�oes
	 */
	public Opcoes getOpcoes() {
		return opcoes;
	}

	/**
	 * Retorna o cliente
	 * 
	 * @return o cliente
	 */
	public Cliente getCliente() {
		return cliente;
	}

	/**
	 * retorna o codigo do equipamento
	 * 
	 * @return o codigo do equipamento
	 */
	public int getCodigoDoEquipamento() {
		return codigoDoEquipamento;
	}

	/**
	 * retorna o cpf do cliente
	 * 
	 * @return cpf do cliente
	 */
	public String getCpf() {
		return cpf;
	}

	/**
	 * seta o cliente
	 * 
	 * @param cliente
	 *            o cliente a ser setado
	 */
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	/**
	 * Zera o codigo do produto
	 * 
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void zerarOCodigo() throws FileNotFoundException, IOException {
		this.codigoDoEquipamento = 0;
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
				"Codigo"));

		try {
			out.writeObject(this.codigoDoEquipamento);
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
